package cn.smile.business.core;

import cn.smile.bean.dto.core.RoleInfoDTO;
import cn.smile.bean.entity.core.RoleInfo;
import cn.smile.bean.form.core.role.RoleAddForm;
import cn.smile.bean.form.core.role.RoleQueryForm;
import cn.smile.bean.form.core.role.RoleRelUpdateForm;
import cn.smile.bean.form.core.role.RoleUpdateForm;
import cn.smile.commons.domain.IBaseService;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author smile-jt
 */
public interface IRoleService extends IBaseService<RoleInfo> {

    /**
     * 检查角色代码是否存在
     *
     * @param roleCode 角色代码
     * @return true-存在, false-不存在
     */
    boolean checkCode(String roleCode);

    /**
     * 新增角色信息
     *
     * @param form 新增参数
     * @return 新增结果
     */
    Boolean addInfo(RoleAddForm form);

    /**
     * 更新角色信息
     *
     * @param form 更新参数
     * @return 更新结果
     */
    Boolean updateInfo(RoleUpdateForm form);

    /**
     * 查询角色列表
     *
     * @param form 查询参数
     * @return 查询结果
     */
    List<RoleInfoDTO> queryList(RoleQueryForm form);

    /**
     * 分页查询
     *
     * @param form 查询参数
     * @return 查询结果
     */
    IPage<RoleInfoDTO> queryPage(RoleQueryForm form);

    /**
     * 绑定角色用户关系
     *
     * @param form 绑定参数
     * @return 绑定结果
     */
    Boolean updateRel(RoleRelUpdateForm form);

    /**
     * 根据ID查询
     *
     * @param id 数据ID
     * @return 查询结果
     */
    RoleInfoDTO getInfoById(String id);

    /**
     * 查询超级管理员角色
     *
     * @param role 角色Code集合
     * @return 查询结果
     */
    List<RoleInfoDTO> queryRole(List<String> role);

    /**
     * 注册用户初始化角色
     *
     * @param userId 用户ID
     * @return 初始化结果
     */
    Boolean initUser(String userId);

    /**
     * 写入角色权限到Redis
     */
    void writeToRedis();

    /**
     * 获取路由 Code 集合(菜单Code)
     *
     * @return 路由集合
     */
    List<String> getRouteCodeByLogin();

    /**
     * 获取登录用户角色集合
     *
     * @return 登录角色集合
     */
    List<RoleInfoDTO> getLoginRoles();

    /**
     * 根据用户ID查询角色Code集合
     *
     * @param userIds 用户ID
     * @return 查询结果
     */
    Map<String, Set<String>> getRoleCodeMap(List<String> userIds);

    /**
     * 根据用户ID更新关联
     *
     * @param roleCodes 用户角色集合
     * @param userId    用户ID
     */
    void saveRoleByUser(List<String> roleCodes, String userId);
}
